﻿'=====================================================================
'模 块 名：NumberStates

'描    述：数字状态机类，支持int32数据类型的表示范围
' 
'          min = ready
'          min+1 ~ max-1 = run
'          max = over

'原始版本：1.00
'作    者：刘德亮
'完成日期：2020-7-16

'修改版本：
'修改作者：
'修改日期：
'修改记录：
'=====================================================================
Namespace FL_8x0.Common


    Public Class NumberStates
        Private lngMin As Int32 = 0
        Private lngMax As Int32 = 0

        Private lngStates_pre As Int32 = 0  '上一次调用change()状态暂存
        Private lngStates As Int32 = 0  '当前状态暂存


        '=====================================================================
        '模 块 名：Init
        '入    口：min = 最小值（ready状态）
        '          max = 最大值（over状态）
        '出    口：
        '功    能：初始化
        '=====================================================================
        Public Sub Init(ByVal min As Int32, ByVal max As Int32)
            '参数检查
            If min > max Then
                Me.lngMin = max
                Me.lngMax = min
            Else
                Me.lngMax = max
                Me.lngMin = min
            End If

            Me.lngStates_pre = Me.lngMin
            Me.lngStates = Me.lngMin
        End Sub


        '=====================================================================
        '模 块 名：GetStates
        '入    口：
        '出    口：当前状态
        '功    能：读取当前状态
        '=====================================================================
        Public Function GetStates() As Int32
            Return Me.lngStates
        End Function


        '=====================================================================
        '模 块 名：GetMin
        '入    口：
        '出    口：最小值
        '功    能：读取最小状态
        '=====================================================================
        Public Function GetMin() As Int32
            Return Me.lngMin
        End Function


        '=====================================================================
        '模 块 名：GetMax
        '入    口：
        '出    口：最大值
        '功    能：读取最大状态
        '=====================================================================
        Public Function GetMax() As Int32
            Return Me.lngMax
        End Function


        '=====================================================================
        '模 块 名：Change
        '入    口：index = 新状态
        '出    口：False =  超出范围, True = 正常
        '功    能：改变状态
        '=====================================================================
        Public Function Change(ByVal index As Int32) As Boolean
            '参数检查
            If index >= Me.lngMin And index <= Me.lngMax Then
                Me.lngStates_pre = Me.lngStates
                Me.lngStates = index

                Return True
            End If

            Return False
        End Function


        '=====================================================================
        '模 块 名：ChangeReady
        '入    口：
        '出    口：
        '功    能：改变为最小状态
        '=====================================================================
        Public Sub ChangeReady()
            Me.lngStates = Me.lngMin
        End Sub


        '=====================================================================
        '模 块 名：ChangeOver
        '入    口：
        '出    口：
        '功    能：改变为最大状态
        '=====================================================================
        Public Sub ChangeOver()
            Me.lngStates = Me.lngMax
        End Sub


        '=====================================================================
        '模 块 名：NextOne
        '入    口：
        '出    口：False =  超出范围, True = 正常
        '功    能：状态增1
        '=====================================================================
        Public Function NextOne() As Boolean
            Return Me.Change(Me.GetStates() + 1)
        End Function


        '=====================================================================
        '模 块 名：LastOne
        '入    口：
        '出    口：False =  超出范围, True = 正常
        '功    能：状态减1
        '=====================================================================
        Public Function LastOne() As Boolean
            Return Me.Change(Me.GetStates() - 1)
        End Function


        '=====================================================================
        '模 块 名：isReady
        '入    口：
        '出    口：True = ready状态
        '功    能：检查当前是否ready状态
        '=====================================================================
        Public Function isReady() As Boolean
            If Me.lngStates = Me.lngMin Then
                Return True
            End If

            Return False
        End Function


        '=====================================================================
        '模 块 名：isOver
        '入    口：
        '出    口：True = over状态
        '功    能：检查当前是否over状态
        '=====================================================================
        Public Function isOver() As Boolean
            If Me.lngStates = Me.lngMax Then
                Return True
            End If

            Return False
        End Function


        '=====================================================================
        '模 块 名：isRunning
        '入    口：
        '出    口：True = running状态
        '功    能：检查当前是否running状态
        '=====================================================================
        Public Function isRunning() As Boolean
            If (Not Me.isReady()) And (Not isOver()) Then
                Return True
            End If

            Return False
        End Function


        '=====================================================================
        '模 块 名：isChanged
        '入    口：
        '出    口：True = 发生了状态改变
        '功    能：检查当前是否有状态改变
        '          距上次调用change()和isChanged()
        '=====================================================================
        Public Function isChanged() As Boolean
            If Me.lngStates_pre <> Me.lngStates Then
                Me.lngStates_pre = Me.lngStates
                Return True
            End If

            Return False
        End Function

    End Class
End Namespace